package com.ruoyi.business.base;

import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.utils.StringUtils;
import lombok.SneakyThrows;
import org.apache.commons.lang3.ObjectUtils;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

/**
 * Jo sql 工具包
 *
 * @author Jyl
 */
public class JoSqlUtil
{

    /**
     * json 转换实体对象
     *
     * @param page
     * @param rClass
     * @param <R>
     * @return
     */
    public <R> IPage<R> jsonToEntity(IPage page, Class<R> rClass)
    {
        if (page.getTotal() == 0)
        {
            return page;
        }

        page.setRecords(jsonToEntity(page.getRecords(), rClass));
        return page;
    }

    /**
     * sql注入 vo对象
     */
    @SneakyThrows
    public String sqlVO(String sql, Object vo)
    {
        Class exampleObjectClass = vo.getClass();
        Field[] fields = exampleObjectClass.getDeclaredFields();
        for (Field fi : fields)
        {
            fi.setAccessible(true);
            Object str = fi.get(vo);
            sql = sql.replaceAll("#\\{" + fi.getName() + "}", str + "");
        }
        return sql;
    }

    /**
     * sql注入 json对象
     */
    @SneakyThrows
    public String sqlJson(String sql, Object Json)
    {
        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(Json);

        for (Map.Entry<String, Object> entry : jsonObject.entrySet())
        {
            String k = entry.getKey();
            Object v = entry.getValue();
            //防止单引号转义
            if (v instanceof String)
            {
                v= ((String) v).replaceAll("'", "''");
            }
            sql = sql.replaceAll("#\\{" + k + "}", v + "");
        }
        return sql;
    }

    /**
     * 条件判断 数据 是否拼接sql
     */
    public String sqlIf(String sql, Object str)
    {
        if (ObjectUtils.isEmpty(str))
        {
            return "";
        }
        return StringUtils.isNotBlank(str.toString()) ? sql : "";
    }

    /**
     * List<json> 序列化 对象
     */
    public <E> List<E> jsonToEntity(List list, Class<E> e)
    {
        return JSONArray.parseArray(JSONArray.toJSONString(list), e);
    }

    /**
     * ids字段转换为 name字段
     *
     * @param tableName 表对象
     * @param ids       源ids
     * @param names     转换name字段
     * @return sql
     */
    public String sqlSelect(String tableName, String ids, String names)
    {
        String sql = " SELECT GROUP_CONCAT( child.#{names} SEPARATOR ',' ) FROM #{tableName} child WHERE FIND_IN_SET(" +
                "child.id, #{ids} ) > 0";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("tableName", tableName);
        jsonObject.put("ids", ids);
        jsonObject.put("names", names);
        return sqlJson(sql, jsonObject);
    }


    /**
     * 字典映射转换 ids字段转换为 dict_label字段
     *
     * @param ids      源ids
     * @param dictType 字典类型
     * @return sql
     */
    public String sqlDictSelect(String ids, String dictType)
    {
        String sql = " SELECT GROUP_CONCAT( child.dict_label SEPARATOR ',' ) FROM sys_dict_data child WHERE " +
                "FIND_IN_SET(child.dict_value, #{ids} ) > 0 and child.dict_type='#{dict_type}' ";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("ids", ids);
        jsonObject.put("dict_type", dictType);
        return sqlJson(sql, jsonObject);
    }

    /**
     * 别名包装
     *
     * @param sql
     * @param asName 别名字段
     * @return sql
     */
    public String sqlSelectAs(String sql, String asName)
    {
        return "(" + sql + ") as " + asName;
    }
}
